package com.lh.nk;

/**
 * @author: linghao
 * @since: 2023/1/23
 *
 * 描述
 * 写一个函数 StrToInt，实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
 * 1.若干空格
 * 2.（可选）一个符号字符（'+' 或 '-'）
 * 3. 数字，字母，符号，空格组成的字符串表达式
 * 4. 若干空格
 */
public class 把字符串转换成整数atoiNC100 {

    public static void main(String[] args) {
        System.out.println(StrToInt("   -82   "));
    }


    /*
    一个数字一个数字地转换，前面的扩大十倍加上后面一位。 res = res * 10 + sign * (c - '0');
     */

    public static int StrToInt (String s) {
        // write code here
        if(s.isEmpty())return 0;
        //去除两边多余空格
        //标记下标
        int index = 0;
        int n = s.length();
        //去除前导空格
        while (index<n){
            char c = s.charAt(index);
            if(' '==c){
                index++;
            }else{
                break;
            }
        }
        if(index == n)return 0;
        //判断开头是否正负号
        int sige = 1;
        if(s.charAt(index) == '+'){
             index++;
        }else if(s.charAt(index) == '-'){
            index++;
            sige = -1;
        }
        if(index == n)return 0;
        int res = 0;
        while (index<n){
            char c = s.charAt(index);
            //如果开头没有就直接结束跳出
            if(c<'0' || c>'9'){
                break;
            }
            //处理越界
            // 整数超过 32 位有符号整数范围 [−231,  231 − 1] ，需要截断这个整数，使其保持在这个范围内。
            // 具体来说，小于 −231的整数应该被调整为 −231 ，大于 231 − 1 的整数应该被调整为 231 − 1
            //res 大于Integer.MAX_VALUE/10 商，或者 res == Integer.MAX_VALUE 并且 (c-'0') 大于 Integer.MAX_VALUE % 10 余数
            if(res > Integer.MAX_VALUE/10 || (res == Integer.MAX_VALUE/10 && (c-'0')>Integer.MAX_VALUE % 10)){
                return Integer.MAX_VALUE;
            }
            if(res < Integer.MIN_VALUE/10 || (res == Integer.MIN_VALUE/10 && (c-'0')>-(Integer.MIN_VALUE % 10))){
                return Integer.MIN_VALUE;
            }
            res = res * 10+sige*(c-'0');
            index++;
        }
        return res;
    }
}
